JavaSE - 数据类型
数据类型
Java 是一种强类型语言,每个变量都必须声明其类型。
扩展:各种字符集和编码详解(https://www.cnblogs.com/cmt/p/14553189.html)
1、强弱类型语言
强类型语言
强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括 Java、.net 、Python、C++等语言。
举个例子:定义了一个整数,如果不进行强制的类型转换,则不可以将该整数转化为字符串。
弱类型语言
弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括 vb 、PHP、javascript 等语言。
在 VB Script 中,可以将字符串‘12’和整数 3 进行连接得到字符串‘123’,也可以把它看成整数 123,而不需 要显示转换。是不是十分的随便,我们 Java 就不是这样的。
区别
无论是强类型语言还是弱类型语言,判别的根本是是否会隐性的进行语言类型转变。强类型语言在速度上略逊于弱类型语言,但是强类型定义语言带来的严谨性又能避免不必要的错误。
2、数据类型
Java 的数据类型分为两大类:基本类型(primitive type)和引用类型 (reference type)

【注:引用数据类型的大小统一为 4 个字节,记录的是其引用对象的地址!】

如果你看到这一堆头疼的话,没关系,不用记,JDK 中类型对应的包装类都帮忙写好了,我们需要时候可 以直接看到!可以把以下代码拷贝进行查看结果:
public static void main(String[] args) {
// byte
System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println("包装类:java.lang.Byte");
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
System.out.println("包装类:java.lang.Short");
System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
System.out.println("包装类:java.lang.Integer");
System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
System.out.println("包装类:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
System.out.println("包装类:java.lang.Float");
System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
System.out.println("包装类:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
System.out.println("包装类:java.lang.Character");
// 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
System.out.println("最小值:Character.MIN_VALUE="+ (int) Character.MIN_VALUE);
// 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
System.out.println("最大值:Character.MAX_VALUE="+ (int) Character.MAX_VALUE);
}字节相关知识:
位(bit):是计算机 内部数据 储存的最小单位,11001100 是一个八位二进制数。
字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写 B 来表示。
1B(byte,字节)= 8bit(位)
字符:是指计算机中使用的字母、数字、字和符号
ASCIIS 码:
| 内容 | 占用大小 |
|---|---|
| 1 个英文字符(不分大小写) | 1 个字节 |
| 1 个中文汉字 | 2 个字节 |
| 1 个 ASCII 码 | 1 个字节 |
UTF-8 编码:
| 内容 | 占用大小 |
|---|---|
| 1 个英文字符 | 1 个字节 |
| 英文标点 | 1 个字节 |
| 1 个中文(含繁体 | 3 个字节 |
| 中文标点 | 3 个字节 |
Unicode 编码:
| 内容 | 占用大小 |
|---|---|
| 1 个英文字符 | 2 个字节 |
| 英文标点 | 2 个字节 |
| 1 个中文(含繁体 | 2 个字节 |
| 中文标点 | 2 个字节 |
1bit 表示 1 位 1Byte 表示一个字节
1B=8b 1024B=1KB 1024KB=1M 1024M=1G
那有人会问:电脑的 32 位和 64 位的区别是什么呢?
32 位操作系统只可以使用 32 位的 cpu,而 64 位的 CPU 既可以安装 32 位操作系统也可以安装 64 位操作 系统。
寻址能力简单点说就是支持的内存大小能力,64 位系统最多可以支达 128 GB 的内存,而 32 位系统最 多只可以支持 4G 内存。
32 位操作系统只可以安装使用 32 位架构设计的软件,而 64 位的 CPU 既可以安装使用 32 位软件也可以 安装使用 64 位软件。
现在的电脑都是 64 位了!
回到正题,我们了解了这些知识后,我们自己定义一些变量来看!
public static void main(String[] args) {
//整型
int i1=100;
//长整型
long i2=998877665544332211L;
//短整型
short i3=235;
//浮点型
double d1=3.5; //双精度
double d2=3;
float f1=(float)3.5; //单精度
float f2=3.5f; //单精度
//布尔类型 boolean true真/false假
boolean isPass=true;
boolean isOk=false;
boolean isBig=5>8;
if(isPass){
System.out.println("通过了");
}else{
System.out.println("未通过");
}
//单字符
char f='女';
char m='男';
}Java 语言的整型常数默认为 int 型,浮点数默认是 Double
3、整型拓展
在我们计算机中存在很多进制问题,十进制,八进制,十六进制等等的问题,他们怎么表示呢?
十进制整数,如:99,-500,0。
八进制整数,要求以 0 开头,如:015。
十六进制数,要求 0x 或 0X 开头,如:0x15 。
演示:
//整型
int i= 10;
int i2= 010;
int i3= 0x10;
System.out.println(i); //10
System.out.println(i2); //8
System.out.println(i3); //164、浮点型拓展
【金融面试问:银行金融业务用什么类型表示?】
浮点类型 float,double 的数据不适合在不容许舍入误差的金融计算领域。
如果需要进行不产生舍入误差的精确数字计算,需要使用 BigDecimal 类。
public static void main(String[] args) {
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d); //false
float d1 = 2131231231f;
float d2 = d1+1;
if(d1==d2){
System.out.println("d1==d2");
}else{
System.out.println("d1!=d2");
}
}最后运行结果:
false d1==d2
主要理由:
由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很 多数字无法精确表示,其结果只能是接近,但不等于;二进制浮点数不能精确的表示 0.1,0.01,0.001 这样 10 的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。
大数值:Java.math 下面的两个有用的类:BigInteger 和 BigDecimal,这两个类可以处理任意长度的数 值。BigInteger 实现了任意精度的整数运算。BigDecimal 实现了任意精度的浮点运算。
浮点数使用总结:
- 默认是 double
- 浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需 要使用 BigDecimal 类。
- 避免比较中使用浮点数
5、字符型拓展
单引号用来表示字符常量。例如‘A’是一个字符,它与「A」是不同的,「A」表示一个字符串。
char 类型用来表示在 Unicode 编码表中的字符。
Unicode 编码被设计用来处理各种语言的所有文字,它占 2 个字节,可允许有 65536 个字符;
科普:2 字节=16 位,2 的 16 次方=65536,我们用的 Excel 原来就只有这么多行,并不是无限的
【代码演示:字符转 int 看结果】
public static void main(String[] args) {
char c1 = 'a';
char c2 = '中';
System.out.println(c1);
System.out.println((int) c1); //97
System.out.println(c2);
System.out.println((int) c2); //20013
}Unicode 具有从 0 到 65535 之间的编码,他们通常用从’u0000’到’uFFFF’之间的十六进制值来表示(前缀为 u 表示 Unicode)
char c3 = '\u0061';
System.out.println(c3); //aJava 语言中还允许使用转义字符 ‘’ 来将其后的字符转变为其它的含义,有如下常用转义字符:

【以后我们学的 String 类,其实是字符序列(char sequence)。在这里给大家一个思考题】
//代码1
String sa=new String("Hello world");
String sb=new String("Hello world");
System.out.println(sa==sb); // false
//代码2
String sc="Hello world";
String sd="Hello world";
System.out.println(sc==sd); // true大家可以先思考下为什么,之后我们学到对象的时候,会给大家进行内存级别的分析,那时候你会恍然 大悟!
6、布尔型拓展
boolean 类型(一位,不是一个字节),就是 0|1
boolean 类型有两个值,true 和 false,不可以 0 或非 0 的整数替代 true 和 false ,这点和 C 语言不同。
boolean 类型用来判断逻辑条件,一般用于程序流程控制。
boolean flag = false;
if(flag){
// true分支
}else{
// false分支
}【编码规范:很多新手程序员喜欢这样写】
if (is == true && un == false ) {...}只有新手才那么写。对于一个熟练的人来说,应该用如下方式来表示:
if ( is && !un ) {....}前面加个 ! 表示否定
这点都不难理解吧。所以要习惯去掉所有的==fasle 和 ==true。Less is More!! 代码要精简易读!